package com.zenithmind.coding.pojo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Objects;

/**
 * 编程问题实体类 - 遵循单一职责原则，只包含问题的基本信息
 *
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
@TableName("coding_problem")
@Schema(description = "编程问题实体")
public class Problem extends BaseEntity {

    /**
     * 问题标题
     */
    @Schema(description = "问题标题")
    private String title;

    /**
     * 问题描述
     */
    @Schema(description = "问题描述")
    private String description;

    /**
     * 输入说明
     */
    @Schema(description = "输入说明")
    private String inputDescription;

    /**
     * 输出说明
     */
    @Schema(description = "输出说明")
    private String outputDescription;

    /**
     * 示例输入
     */
    @Schema(description = "示例输入")
    private String sampleInput;

    /**
     * 示例输出
     */
    @Schema(description = "示例输出")
    private String sampleOutput;

    /**
     * 提示信息
     */
    @Schema(description = "提示信息")
    private String hint;

    /**
     * 问题来源
     */
    @Schema(description = "问题来源")
    private String source;

    /**
     * 问题分类ID
     */
    @Schema(description = "问题分类ID")
    private String categoryId;

    /**
     * 问题分类名称
     */
    @Schema(description = "问题分类名称")
    private String categoryName;

    /**
     * 问题标签（JSON格式）
     */
    @Schema(description = "问题标签（JSON格式）")
    private String tags;

    /**
     * 难度等级（1-简单，2-中等，3-困难，4-专家）
     */
    @Schema(description = "难度等级（1-简单，2-中等，3-困难，4-专家）")
    private Integer difficulty;

    /**
     * 问题类型（1-算法，2-数据结构，3-数学，4-字符串，5-动态规划，6-图论）
     */
    @Schema(description = "问题类型（1-算法，2-数据结构，3-数学，4-字符串，5-动态规划，6-图论）")
    private Integer type;

    /**
     * 问题状态（0-草稿，1-已发布，2-已下架，3-审核中）
     */
    @Schema(description = "问题状态（0-草稿，1-已发布，2-已下架，3-审核中）")
    private Integer status;

    /**
     * 时间限制（毫秒）
     */
    @Schema(description = "时间限制（毫秒）")
    private Integer timeLimit;

    /**
     * 内存限制（KB）
     */
    @Schema(description = "内存限制（KB）")
    private Integer memoryLimit;

    /**
     * 支持的编程语言（JSON格式）
     */
    @Schema(description = "支持的编程语言（JSON格式）")
    private String supportedLanguages;

    /**
     * 是否特殊评判（0-否，1-是）
     */
    @Schema(description = "是否特殊评判（0-否，1-是）")
    private Integer isSpecialJudge;

    /**
     * 特殊评判代码
     */
    @Schema(description = "特殊评判代码")
    private String specialJudgeCode;

    /**
     * 创建者ID
     */
    @Schema(description = "创建者ID")
    private String creatorId;

    /**
     * 创建者名称
     */
    @Schema(description = "创建者名称")
    private String creatorName;

    /**
     * 是否公开（0-私有，1-公开）
     */
    @Schema(description = "是否公开（0-私有，1-公开）")
    private Integer isPublic;

    /**
     * 是否推荐（0-否，1-是）
     */
    @Schema(description = "是否推荐（0-否，1-是）")
    private Integer isRecommend;

    /**
     * 排序值
     */
    @Schema(description = "排序值")
    private Integer sortOrder;

    /**
     * 重写equals方法以确保里氏替换原则
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        if (!super.equals(obj)) return false;

        Problem problem = (Problem) obj;
        return Objects.equals(title, problem.title) &&
               Objects.equals(difficulty, problem.difficulty) &&
               Objects.equals(type, problem.type);
    }

    /**
     * 重写hashCode方法以确保里氏替换原则
     */
    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), title, difficulty, type);
    }
}
